跳到主要内容

VS Code插件开发

Create by fall on 20 Feb 2023 Recently revised in 20 Feb 2023

开发 VS Code 插件

VS Code 插件由两部分组成:配置声明和代码。

配置声明:代码入口文件,插件激活时机,菜单项,快捷键等等

VSCode 的本体没有加入各种语言的编辑能力,是插件完成的,比如:css-language-features\typescript-language-features

实现语言插件

声明式语言特性(Declarative language features):编写配置文件来定义一些特性

编程式语言特性

声明式语言特性可实现:代码高亮、Snippet 补全、括号匹配、括号自动闭合、注释 / 反注释、缩进、折叠

{
"comments":{
"lineComment":"//", // 注释,返注释
"blockComment":["/*","*/"] // 区块注释
}
}

实现代码高亮

VSCode 的代码高亮分为两步:

  • 符号化(Tokenization)使用 TextMate language grammars(语言语法) 来进行词法解析。
    • language grammars 用于为代码中的元素(如关键字、注释、字符串等)分配名称。
    • 允许我们根据编写名称的选择器进行样式化(语法高亮展示)
  • 样式化(Theming)使用 scope selector(范围选择器) 来选取第一步分析出的特定元素,然后为它们指定样式。

理解为,将给定的语法内容视为伪元素,给伪元素添加样式,就可以实现代码高亮

{ // 最基本的匹配示例
// 定义一些关键字 keywords
"keywords": {
"patterns": [
// 匹配到的这些 if else ... 都会标记为 keyword.control.test
{ "name": "keyword.control.test", "match": "\\b(if|else|while|for|return)\\b" }
// name 属性中 a.b.c 其中 a.b 可以选择到 a.b.c
]
}
}

我们实现跨语言的字符串设置时,比如:

C 语言中 scope 为 string.quoted.double.c

TypeScript 中单引号 scope 为 string.quoted.single.ts

我们只需要选中 string.quoted 为其设定样式即可

{
// 表示我们这次匹配的是 string
"string": {
"name":"string.quoted.double.ts",
// 在被 begin 和 end 之间匹配的所有内容都被标记为 name,如果匹配不到 end 默认定位到内容的末尾
"begin": "\"",
"end": "\"",
}
}

参考文章

作者文章名称
野生VSCode 语言插件开发入门